#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "../inc/general.h"

#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif

// 延时函数
void cross_sleep(unsigned int milliseconds)
{
#ifdef _WIN32
    Sleep(milliseconds);
#else
    usleep(milliseconds * 1000); // Linux使用微秒单位，需要乘以1000
#endif
}

void clearScreen()
{
#ifdef _WIN32
    system("cls");
#else
    system("clear");
#endif
}

void return_Main()
{
    while (1)
    {
        char c;
        print_Lines();
        printf("输入 Q 返回上一级:");
        while (1)
        {
            scanf(" %c", &c);
            while (getchar() != '\n')
                ;
            if (c == 'q' || c == 'Q')
            {
                clearScreen();
                return;
            }
            else
            {
                printf("输入错误，请重新输入:");
            }
        }
    }
}

int return_function()
{
    while (1)
    {
        print_Lines();
        char c;
        printf("是否重新执行?(Y/N)");
        scanf(" %c", &c);
        while (getchar() != '\n')
            ;
        if (c == 'Y' || c == 'y')
        {
            clearScreen();
            return 1;
        }
        else if (c == 'N' || c == 'n')
        {
            clearScreen();
            return -1;
        }
        else
        {
            printf("输入错误,请重新输入!\n");
        }
    }
}

int *scanf_menu(int *menu)
{
    while (1)
    {
        int result = scanf("%d", menu);
        if (result != 1 || *menu < 0 || *menu > 9)
        {
            printf("输入异常!重新输入:");
            while (getchar() != '\n')
            {
                continue; // 丢弃所有剩余字符，包括回车
            }
            continue;
        }
        else
        {
            break;
        }
    }
    return menu;
}

int if_goOn()
{
    char input;
    while (1)
    {
        scanf(" %c", &input);
        while (getchar() != '\n')
            ;
        if (input == 'Y' || input == 'y')
        {
            return 1;
        }
        else if (input == 'N' || input == 'n')
        {
            return -1;
        }
        else
        {
            printf("输入错误,请重新输入:");
        }
    }
}

void clearChar()
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF)
        ; // 清空所有残留字符
}

void print_Lines()
{
    printf("----------------------------------------------------------------------------------\n");
}

void print_Lines2()
{
    printf("==================================================================================\n");
}

void print_Lines3()
{
    printf("-------------------------------------------------------------\n");
}

void print_Lines4()
{
    printf("=============================================================\n");
}

void print_Lines5()
{
    printf("-----------------------------------------------------------------------------------------------------\n");
}

void print_Lines6()
{
    printf("=====================================================================================================\n");
}

void waitForAnyKey()
{
    printf("按任意键继续...");
    fflush(stdout);

    getchar();

    // 可选：清空后续所有输入直到换行符
    int c;
    clearChar();
}

char *get_status(int index)
{
    if (index == 0)
        return "正在进行";
    else if (index == 1)
        return "已完成";
}

// 日期格式校验函数 (YYYY-MM-DD)
int isValidDate(const char *date)
{
    if (strlen(date) != 10)
        return 0;
    if (date[4] != '-' || date[7] != '-')
        return 0;

    // 检查数字部分
    for (int i = 0; i < 10; i++)
    {
        if (i == 4 || i == 7)
            continue;
        if (!isdigit(date[i]))
            return 0;
    }

    // 提取年月日
    int year, month, day;
    if (sscanf(date, "%d-%d-%d", &year, &month, &day) != 3)
        return 0;

    // 基本范围检查
    if (year < 2000 || year > 2100)
        return 0;
    if (month < 1 || month > 12)
        return 0;
    if (day < 1 || day > 31)
        return 0;

    return 1;
}

// 时间格式校验函数 (HH:MM)
int isValidTime(const char *time)
{
    if (strlen(time) != 5)
        return 0;
    if (time[2] != ':')
        return 0;

    // 检查数字部分
    for (int i = 0; i < 5; i++)
    {
        if (i == 2)
            continue;
        if (!isdigit(time[i]))
            return 0;
    }

    // 提取时分
    int hour, minute;
    if (sscanf(time, "%d:%d", &hour, &minute) != 2)
        return 0;

    // 范围检查
    if (hour < 0 || hour > 23)
        return 0;
    if (minute < 0 || minute > 59)
        return 0;

    return 1;
}

int if_goOn_add_Q()
{
    char input;
    while (1)
    {
        scanf(" %c", &input);
        clearChar();

        if (input == 'y' || input == 'Y')
            return 1;
        else if (input == 'n' || input == 'N')
            return -1;
        else if (input == 'q' || input == 'Q')
            return 0;
        else
        {
            printf("指令错误!\n");
        }
    }
}

int validate_string_format(const char *str)
{
    // 检查长度是否为6
    if (str == NULL || strlen(str) != 6)
    {
        return -1;
    }

    // 检查前2位是否为大写字母
    for (int i = 0; i < 2; i++)
    {
        if (!isupper(str[i]))
        {
            return -1;
        }
    }

    // 检查后4位是否为数字
    for (int i = 2; i < 6; i++)
    {
        if (!isdigit(str[i]))
        {
            return -1;
        }
    }

    return 1;
}

int is_valid_phone(const char *phone)
{
    // 检查长度
    if (strlen(phone) != 11)
    {
        return 0;
    }

    // 检查是否全为数字
    for (int i = 0; i < 11; i++)
    {
        if (!isdigit(phone[i]))
        {
            return 0;
        }
    }

    // 检查有效号段（可选）
    char prefix[3] = {phone[0], phone[1], '\0'};
    char *valid_prefixes[] = {"13", "14", "15", "16", "17", "18", "19"};
    int valid = 0;
    for (int i = 0; i < sizeof(valid_prefixes) / sizeof(valid_prefixes[0]); i++)
    {
        if (strcmp(prefix, valid_prefixes[i]) == 0)
        {
            valid = 1;
            break;
        }
    }
    if (!valid)
    {
        return 0;
    }

    return 1;
}